  ________       __          ________                          ___ ___                __    
 /  _____/______|__| _____   \______ \ _____ __  _  ______    /   |   \  ____   ____ |  | __
/   \  __\_  __ \  |/     \   |    |  \\__  \\ \/ \/ /    \  /    ~    \/  _ \ /  _ \|  |/ /
\    \_\  \  | \/  |  | |  \  |    `   \/ __ \\     /   |  \ \    Y    (  <_> |  <_> )    < 
 \______  /__|  |__|__|_|  / /_______  (____  /\/\_/|___|  /  \___|_  / \____/ \____/|__|_ \
        \/               \/          \/     \/           \/         \/                    \/
    
    Grim Dawn Hook (c) 2015 atom0s [atom0s@live.com]

----------------------------------------------------------------------------------------------------

>> What are plugins?

    Plugin's are modules that can be loaded externally from GDHook into the games memory space. 
    Plugin's are used to extend what the game can do, while interacting with GDHook.
    
    Plugin's can be coded in any language that can make use of a header file, or an altered version
    of the header file needed within the SDK. This means languages such as the following should all work:
        C, C++, ASM, Delphi and more!
        
----------------------------------------------------------------------------------------------------

>> Plugin SDK

    The plugin SDK, required to build a valid plugin for GDHook, can be found at:
        \GDHook\Plugins\SDK\
        
----------------------------------------------------------------------------------------------------

>> Creating A Valid Plugin

    To start, your plugin needs to include 'Plugin.h'. This contains the needed classes to create 
    your plugin.
    
    Next, you need to create a main class for your plugin. This class must inherit 'PluginBase'.
    
    Next, you need to expose the required exported functions. These include:
        - GetInterfaceVersion
        - CreatePluginData
        - CreatePlugin

    These need to be exported as C functions so the names are not mangled! (In C++ this can be done via a .def file.)
    
    Last, your plugin must return true in the Initialize call of your main plugin class. If not the plugin
    will fail to load as it is treated as invalid then.
    
    Your plugin also needs to export the plugin information via GetPluginData.
    
----------------------------------------------------------------------------------------------------

>> Small Example

    An example of what your plugin class should look like is:
    
        class YourPluginName : PluginBase
        {
        public:
            YourPluginName(void);
            virtual ~YourPluginName(void);
            
            PluginData GetPluginData(void);
            
            bool Initialize(IHookCore* hookCore, DWORD dwPluginId)
            {
                return true;
            }
        }    

----------------------------------------------------------------------------------------------------

>> Full Example

    A full example of an example plugin can be found in:
        \GDHook\Documentation\Plugins\ExamplePlugin